import axios from 'axios'
import Vue from 'vue'
import { Message } from 'element-ui'
// import router from '../router'
// 默认axios配置

const request = axios.create({
  // baseURL: 'http://192.168.43.99:9001', // 马鸿飞
  // baseURL: 'http://192.168.64.216:7001', // 刘沛伸
  baseURL: 'http://82.156.109.119:7001', // 网上测试服务器 平时开发使用
  // baseURL: 'http://106.52.170.16:7001', // 网上正式服务器 打包时换成这个
  // baseURL: 'http://192.168.61.231:7001', // 王晓冲
  // baseURL: 'http://localhost:7001',
  timeout: 2000000 // 请求超时时间
})

// 正在进行中的请求列表
let reqList = []

/**
 * 阻止重复请求
 * @param {array} reqList - 请求缓存列表
 * @param {string} url - 当前请求地址
 * @param {function} cancel - 请求中断函数
 * @param {string} errorMessage - 请求中断时需要显示的错误信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  // console.log('stop', reqList)
  // console.log('url', url)
  // console.log('cancel', cancel)
  // console.log('errorMessage', errorMessage)
  const errorMsg = errorMessage || ''
  // console.log('errorMsg', errorMsg)
  // console.log('reqList.length', reqList.length)
  for (let i = 0; i < reqList.length; i++) {
    // console.log('reqList[i]', reqList[i])
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}

/**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
const allowRequest = function (reqList, url) {
  // console.log('allow', reqList)
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}

// 请求拦截器
request.interceptors.request.use(config => {
  let cancel
  // 设置 cancelToken 对象
  config.cancelToken = new axios.CancelToken(c => {
    cancel = c
  })
  stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
  if (sessionStorage.getItem('Token')) {
    // 如果用户已经登录 统一给请求设置token信息
    config.headers.Authorization = `Bearer ${sessionStorage.getItem('Token')}`
    // console.log('请求拦截器 config', config)
  }
  // console.log('请求拦截器 config', config)
  return config
}, error => {
  Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  // const res = response
  // console.log('响应拦截器 response', response)
  allowRequest(reqList, response.config.url)
  if (response.data.code !== 1000) {
    console.log('响应', response.data)
    Message.error({
      center: true,
      message: response.data.msg
    })
  } else {
    return response
  }
  // return response
}, error => {
  if (axios.isCancel(error)) {
    console.log(error.message)
  } else {
    allowRequest(reqList, error.config.url)
  }
  return Promise.reject(error)
})

export default request

Vue.prototype.$axios = axios
